package com.cskaoyan.polymorphism.benefit;

/*
        多态的好处
            提高了程序的维护性(由继承保证)
            提高了程序的扩展性(由多态保证)

       假设，先在有科学家要研究动物的声音
       a. 让动物发出叫声
       b. 收集动物的叫声
       c. 研究收集到的声音

       一开始，科学家之研究猫和狗的声音，过了一段时间，科学家想收集新的动物的声音猪的声音

 */
public class Demo2Benefit {

    public static void main(String[] args) {

        Dog dog = new Dog();
//        collectDogSound(dog);
//
        Cat cat = new Cat();
//        collectCatSound(cat);

        collectAllSound(dog);
        collectAllSound(cat);

        // 收集猪的声音
        Pig pig = new Pig();
        collectAllSound(pig);

    }

    // 定义方法研究狗的声音
    public static void collectDogSound(Dog dog) {
       // 狗发出叫声
       dog.shout();

       // 收集声音

        // 研究声音
    }

    /*
         研究猫的声音
     */
    public static void collectCatSound(Cat cat) {
        // 猫发出叫声
        cat.shout();

        // 收集声音

        // 研究声音
    }


    /*
        收集并研究猫，狗的声音并研究
     */
    public static void collectAllSound(Animal animal) {
        // 这里会发生多态
        animal.shout();
    }
}

class Animal {
    public void shout() {
        System.out.println("动物的叫声");
    }

}
class Dog extends Animal {

    public void shout() {
        System.out.println("汪汪汪");
    }

}

class Cat extends Animal {
    public void shout() {
        System.out.println("喵喵喵");
    }
}

class Pig extends Animal {

    public void shout() {
        System.out.println("猪叫");
    }
}
